package com.data.monitoring.generator;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.extension.service.IService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;

import java.nio.file.Paths;
import java.util.Collections;

/**
 * @author HanYiMing
 * @date 2024/3/29
 * @description mybatis-plus 逆向工程
 */
public class Generator {
    public static void main(String[] args) {
        String projectPath = String.valueOf(Paths.get(System.getProperty("user.dir")));
        String url = "jdbc:mysql://127.0.0.1:3306/data_monitoring?useUnicode=true&characterEncoding=utf8";
//        String username = "postgres";
//        String password = "postgres";
        String username = "root";
        String password = "root";
        // 使用元数据查询的方式生成代码,默认已经根据jdbcType来适配java类型,支持使用typeConvertHandler来转换需要映射的类型映射
        FastAutoGenerator
                .create(url, username, password)
                // 全局配置
                .globalConfig(builder -> {
                    // 指定输出目录
                    builder.outputDir(projectPath + "\\src\\main\\java")
                            // 不打开输出目录
                            .disableOpenDir()
//                            .enableSpringdoc() // 生成 Scheme swagger3 的实体类注释
                            // 作者
                            .author("HanYiMing")
                            // 开启Swagger
                            .enableSwagger() // 开启 swagger 模式
//                            .fileOverride() // 覆盖已生成文件
                            // 时间类型
                            .dateType(DateType.TIME_PACK)
                            // 注释日期
                            .commentDate("yyyy-MM-dd");
                })
                .packageConfig(builder -> {
                    // 父包名
                    builder.parent("com.data.monitoring")
                            // pojo 实体
                            .entity("model.entity")
                            // service 接口
                            .service("service")
                            // impl 实现
                            .serviceImpl("service.impl")
                            // mapper 接口
                            .mapper("mappers")
                            // mapper xml 文件
                            .pathInfo(Collections.singletonMap(OutputFile.xml, projectPath + "/src/main/resources/mapper"))
                            // controller 控制类
                            .controller("controller");
                })
                //模板配置
//                .templateConfig(builder ->
//                {
//                    builder.disable(TemplateType.ENTITY)//禁用模板
//                            .entity("/templates/entity.java")//设置实体模板路径(JAVA)
//                            .service("/templates/service.java")
//                            .serviceImpl("/templates/serviceImpl.java")
//                            .mapper("/templates/mapper.java")
//                            .xml("/templates/mapper.xml")
//                            .controller("/templates/controller.java");
//                })

                //策略配置
                .strategyConfig(builder -> {
                    //开启大写命名
                    builder.enableCapitalMode()
                            //去掉表前缀
                            .addTablePrefix("t_")
                            //Entity配置策略
                            .entityBuilder()//名称转换实现
                            .enableChainModel()//开启链式模型 默认为false
                            .enableLombok()//开启 lombok 模型 默认为false
                            .enableRemoveIsPrefix()//开启 Boolean 类型字段移除 is 前缀 默认为false
                            .enableTableFieldAnnotation()//开启生成实体时生成字段注解 默认为false
                            .enableActiveRecord()//开启 ActiveRecord 模型  默认为false
                            .versionColumnName("version")//乐观锁数据库字段
                            .versionPropertyName("version")//乐观锁实体名
                            .logicDeleteColumnName("deleted")//删除数据库字段
                            .logicDeletePropertyName("deleteFlag")//删除实体名
                            .columnNaming(NamingStrategy.underline_to_camel)//数据库字段表映射到实体的命名策略
//                            .addSuperEntityColumns("created_by", "created_time", "updated_by", "updated_time")//添加父类公共字段  数据库写了就可以不加
                            .addIgnoreColumns()//忽略字段
//                            .addTableFills(new Property("createTime", FieldFill.INSERT))//表字段填充
//                            .addTableFills(new Property("updateTime", FieldFill.INSERT_UPDATE))//表字段填充
//                            .formatFileName("%sDO")
//                            .idType(IdType.ASSIGN_UUID)//全局主键类型
                            //Controller策略配置
                            .controllerBuilder()
                            .enableHyphenStyle()//开启驼峰转连字符 默认为false
                            .enableRestStyle()//开启生成@RestController 控制器 默认为false
                            .formatFileName("%sController")//格式化文件名称
                            //Service配置策略
                            .serviceBuilder()
                            .superServiceClass(IService.class)//设置 service 接口父类
                            .superServiceImplClass(ServiceImpl.class)//设置 service 实现类父类
                            .formatServiceFileName("%sService")//格式化 service 接口文件名称
                            .formatServiceImplFileName("%sServiceImp")//格式化 service 实现类文件名称
                            //Mapper策略配置
                            .mapperBuilder()
                            .superClass(BaseMapper.class)//设置父类
                            .enableBaseResultMap()//启用 BaseResultMap 生成  默认false
                            .enableBaseColumnList()//启用 BaseColumnList  默认false
//                .cache(MyMapperCache.class)//设置缓存实现类
                            .formatMapperFileName("%sMapper")//格式化 mapper 文件名称
                            .formatXmlFileName("%sMapper");//格式化 xml 实现类文件名称
                })
                .templateEngine(new FreemarkerTemplateEngine())
                .execute();

    }
}

